def f(a, b):  # 使用def关键字定义函数
    return a + b


num = f(2, 3)
print(num)
print('*' * 18)


# 默认参数
def f2(a, b=3):  # 默认参数要放在参数列表的末尾
    return a * b


print(f2(2))
print(f2(2, b=4))  # 修改默认参数的值
print(f2(2, 5))  # 修改默认参数的值
print('*' * 18)


# 多个默认参数
def f3(a, b=2, c=3):
    return a * b * c


print(f3(3, 2))  # 参数列表中有多个默认参数，传递参数时默认按照顺序传递
print(f3(3, c=2))  # 定义第二个参数时传递给c的
print('*' * 18)


# 可变参数
def changeF1(*args):  # 使用可变位置参数时，默认将传入的参数封装为tuple元组
    print(len(args), type(args), sep=' ')
    for i in args:
        print(i ** 2, end=' ')


changeF1(1, 2, 3, 4, 5, True)
print()
print('*' * 18)


def changeF2(**kwargs):  # 可变关键字参数 传入的参数形式应为键值对的形式，默认将传入的参数放入到字典中
    for k, v in kwargs.items():
        print(k, '=', v)


changeF2(name='张三', age=15)

# 匿名函数
NoNameF = lambda a, b: a * b
print(NoNameF(2, 3))
#
NoNameF2 = lambda a: a ** 2
a = [1, 2, 3, 4, 5]
result = map(NoNameF2, a)  # map映射函数，第一个参数：函数 第二个参数：函数的每个参数 作用:每个参数都执行函数
print(list(result))
#
from functools import reduce

result = reduce(lambda x, y: x * y, a)  # reduce函数：累积
print(result)
#
result = filter(lambda t: t % 2, a)  # 过滤函数
print(list(result))
